/**
 * 
 */
package compilador.analizadorSintactico.categoriasSintacticas;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import compilador.analizadorSemantico.tablaSimbolos.TablaSimboloSemantico;

/**
 * @author Nolberto Castellanos Rodriguez
 * @author Yurani Alejandra Salamanca Lotero
 *
 * Clase que representa la unidad de compilacion
 */
public class UnidadCompilacion {
	
//	-------------------------------------------------------------------------------------------------
//	ATRIBUTOS
//	-------------------------------------------------------------------------------------------------
	
	/**
	 *  Atributo que representa el paquete dentro de la unidad de compilacion
	 */
	private Paquete paquete;
	
	/**
	 * Atributo que representa las importaciones dentro de la unidad de compilacion
	 */
	private Imports imports;
	
	/**
	 *  Atributo que representa la declaracion de clase dentro de la unidad de compilacion
	 */
	private DeclaracionClase declaracionClase;
	
	


//	-------------------------------------------------------------------------------------------------
//	CONSTRUCTOR
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * Constructor que permite crear una Unidad de Compilacion
	 * @param paquete. Paquete de la Unidad de Compilacion
	 * @param imports. Las importacion que tiene la Unidad de Compilacion
	 * @param declaracionClase. La declaracion de clase que se encuentra en la Unidad de Compilacion
	 */
	public UnidadCompilacion(Paquete paquete, Imports imports, DeclaracionClase declaracionClase) 
	{ 
		this.paquete = paquete;
		this.imports = imports;
		this.declaracionClase = declaracionClase;
	}

	
	
//	-------------------------------------------------------------------------------------------------
//	METODOS
//	-------------------------------------------------------------------------------------------------
	
	/**
	 * @return
	 */
	public String getJavaCode() {
		String retornable = "";
		
		if(paquete!= null)
			retornable += paquete.getJavaCode()+"\n";
		
		if(imports != null)
			retornable += imports.getJavaCode() +"\n";
		
		if(declaracionClase != null)
			retornable += declaracionClase.getJavaCode();
		
		return retornable;
	}
	
	/**
	 * Metodo que permite agregar hojas al nodo de la clase
	 * @return el nodo de la clase con sus hojas
	 */
	public DefaultMutableTreeNode getArbolVisual(){
		DefaultMutableTreeNode miRaiz =  new  DefaultMutableTreeNode("Unidad de Compilacion");
		
		if (paquete != null) 
			miRaiz.add(paquete.getArbolVisual());
		
		if (imports != null) 
			miRaiz.add(imports.getArbolVisual());
		
		if (declaracionClase != null)
			miRaiz.add(declaracionClase.getArbolVisual());
		
		return miRaiz;
	}
	
	public void llenarTablaSimbolos(TablaSimboloSemantico ts){
		this.declaracionClase.llenarTabla(ts);
	}
	
	public void analizarSemantica(TablaSimboloSemantico ts, ArrayList<SimboloError> errores, String claseActual, String metodoActual){
		this.declaracionClase.analizarSemantica(ts, errores, claseActual, metodoActual);
	}
	
//	-------------------------------------------------------------------------------------------------
//	Getters & Setters
//	-------------------------------------------------------------------------------------------------

	
	/**
	 * Metodo que nos retorna el valor de paquete
	 * @return  paquete. Valor retornado
	 */
	public Paquete getPaquete() {
		return paquete;
	}

	/**
	 * Metodo que permite asignar el valor de paquete
	 * @param paquete. Valor a asignar paquete
	 */
	public void setPaquete(Paquete paquete) {
		this.paquete = paquete;
	}

	/**
	 * Metodo que nos retorna el valor de imports
	 * @return  imports. Valor retornado
	 */
	public Imports getImports() {
		return imports;
	}

	/**
	 * Metodo que permite asignar el valor de imports
	 * @param imports. Valor a asignar imports
	 */
	public void setImports(Imports imports) {
		this.imports = imports;
	}

	/**
	 * Metodo que nos retorna el valor de declaracionClase
	 * @return  declaracionClase. Valor retornado
	 */
	public DeclaracionClase getDeclaracionClase() {
		return declaracionClase;
	}

	/**
	 * Metodo que permite asignar el valor de declaracionClase
	 * @param declaracionClase. Valor a asignar declaracionClase
	 */
	public void setDeclaracionClase(DeclaracionClase declaracionClase) {
		this.declaracionClase = declaracionClase;
	}

}
